#pragma once

#include "particle.h"
#include <random>
#include <vector>

namespace PS
{

namespace Number
{

inline std::vector<int>
uniform_distribution(std::size_t number, int min, int max)
{
    std::random_device rd; // 如果可用的话，从一个随机数发生器上获得一个真正的随机数
    std::mt19937 gen(rd()); // gen是一个使用rd()作种子初始化的标准梅森旋转算法的随机数发生器
    std::uniform_int_distribution<> distrib{min, max};
    std::vector<int> rst(number, 0);

    for (std::size_t i = 0; i < number; ++i)
    {
        rst[i] = distrib(gen);
    }

    return rst;
}

template <typename T>
std::vector<T>
uniform_distribution(std::size_t number, T min, T max)
{
    std::random_device rd; // 如果可用的话，从一个随机数发生器上获得一个真正的随机数
    std::mt19937 gen(rd()); // gen是一个使用rd()作种子初始化的标准梅森旋转算法的随机数发生器
    std::uniform_real_distribution<T> distrib{min, max};
    std::vector<T> rst(number, 0);

    for (std::size_t i = 0; i < number; ++i)
    {
        rst[i] = distrib(gen);
    }

    return rst;
}

template <int Dim>
std::vector<Point<Dim>>
generate_random_vector(std::size_t number, const Point<Dim> & min, const Point<Dim> & max)
{
    std::vector<Point<Dim>> rst(number, Point<Dim>{});

    for (auto i = 0; i < Dim; ++i)
    {
        auto tmp = uniform_distribution<typename Point<Dim>::value_type>(number, min[i], max[i]);
        for (std::size_t j = 0; j < number; ++j)
        {
            rst[j][i] = tmp[j];
        }
    }

    return rst;
}

} // namespace Number
} // namespace PS
